﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int x, y;//机器人位置
int m, n;//样例迷宫大小
int x0, y0;//起点
int d0;//初始方向
int result;//行走结果
int d;//方向
char board[106][106];
int count;//步数
int o;//防止开始时就结束
int bu;

int Move()
{
    int i;
    /*for (i = 0; i < m; i++)
    {
        printf("%s\n", board[i]);
    }*/
    bu++;
    if (d == d0 && x == x0 && y == y0 && o != 0)
        return 0;
    if (bu > 150000)
        return 0;

    o = 1;
    if (d == 1)
    {
        if (board[y - 1][x] == 'E' && y > 0)
        {
            y--;
            count++;
            return 1;
        }
        if (board[y - 1][x] == '.' && y > 0)
        {
            y--;
            count++;
            return 2;
        }
        else
        {
            d = d % 4 + 1;
            return 2;
        }

    }
    if (d == 2)
    {
        if (board[y][x + 1] == 'E' && x < n)
        {
            x++;
            count++;
            return 1;
        }
        if (board[y][x + 1] == '.' && x < n)
        {
            x++;
            count++;
            return 2;
        }
        else
        {
            d = d % 4 + 1;
            return 2;
        }


    }
    if (d == 3)
    {
        if (board[y + 1][x] == 'E' && y < m)
        {
            y++;
            count++;
            return 1;
        }
        if (board[y + 1][x] == '.' && y < m)
        {
            y++;
            count++;
            return 2;
        }
        else
        {
            d = d % 4 + 1;
            return 2;
        }


    }
    if (d == 4)
    {
        if (board[y][x - 1] == 'E' && x > 0)
        {
            x--;
            count++;
            return 1;
        }
        if (board[y][x - 1] == '.' && x > 0)
        {
            x--;
            count++;
            return 2;
        }
        else
        {
            d = d % 4 + 1;
            return 2;
        }

    }


}


int main()
{

    int T;
    scanf("%d", &T);
    int i, j;
    while (T--)
    {
        count = 0;
        bu = 0;
        memset(board, '*', sizeof(board));
        scanf("%d%d", &m, &n);
        scanf("%d", &d0);
        d = d0;
        for (i = 0; i < m; i++)
        {
            scanf("%s", board[i]);
        }
        for (i = 0; i < m; i++)
        {
            for (j = 0; j < n; j++)
            {
                if (board[i][j] == 'S')
                {
                    x0 = j;
                    y0 = i;
                    board[i][j] = '.';
                }

            }
        }

        x = x0;
        y = y0;
        o = 0;
        result = Move();

        while (result == 2)
        {
            result = Move();
        }

        if (result == 0)
            printf("Impossible\n");
        else
            printf("%d\n", count);
    }


    return 0;
}


/*
题目描述
一个n∗m格子的迷宫，'.'表示道路，'*'表示墙，'S'表示起点，'E'表示终点。一个机器人一开始在起点，如果在它的方向前是道路，每次能往前走一格；如果在它的方向前是墙或者迷宫边界，它会右转90∘。请问机器人从起点到终点最少走多少步？

输入
第一行是一个整数T(1≤T≤100)，表示样例的个数。 每个样例第一行是三个整数，为n, m(1≤n, m≤100), d(1≤d≤4)，n, m表示迷宫的行、列大小， d表示机器人一开始的方向，1∼4依次表示"上右下左"。 以后的n行是迷宫的情况，数据保证S和E不重合。

输出
每行输出一个样例的结果，如果无法走出迷宫，输出"Impossible"

样例输入
2
3 4 2
S...
***.
E...
3 4 2
S...
....
E.*.
样例输出
8
Impossible
*/